#include "graph.h"
#include<bits/stdc++.h>
#define fi first
#define se second
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
#define NOR NumberOfRoads
#define LR LastRoad
using namespace std;
using namespace __gnu_pbds;
const int S=205,T=80005;
typedef unsigned long long ull;
int col[S];
int n;
mt19937_64 rnd(time(0));
gp_hash_table<int,ull>ucol;
inline ull cval(int ss){
	if(ucol[ss])return ucol[ss];
	return ucol[ss]=rnd();
}
inline int mr(int l,int r){return rnd()%(r-l+1)+l;}
//inline void Add(int u,int v){
//	nxt[++tot]=head[u],to[tot]=v,head[u]=tot;
//}
vector<int>td[S];
int curcnt;
bool fl=0;
//int id[S];
vector<int>nedge[S];
vector<pair<int,int> >spec[S];
gp_hash_table<int,int>um[S];
int di[S];
const int wX=100;
inline void Add(int u,int v){
//	cerr<<u<<" "<<v<<"\n";
//	if(!um[u][v])di[u]++;
//	if(!um[v][u])di[v]++;
//	um[u][v]=um[v][u]=1;
	nedge[u].push_back(v);
	nedge[v].push_back(u);
}
ull has[S];
const int Limi=20;
inline void change(int x,int y,int fr){
//	if(!has[x])has[x]=d[x];
	if(spec[x].size()>Limi)return ;
	spec[x].push_back({y,fr});
//	assert(col[y]!=1);
	has[x]+=1ull*cval(1000*fr)*cval(col[y])*cval(di[y]);
//	cerr<<"Change "<<x<<" "<<y<<" "<<fr<<" "<<col[y]<<"\n";
}
int nowch;

inline ull ch(int v){
	ull pp=0;
//	bool fl=1;
	for(auto s:spec[v]){
//		cerr<<"before assert:"<<v<<" "<<s.fi<<" "<<s.se<<"\n";
		assert(s.se<=NOR());
		Move(s.se,Color());
		int nn=Color();
		Move(LR(),nn);
		if(nn==1)return 0;
		if(col[s.fi]^nn)return 0;
		pp+=1ull*cval(nn)*cval(1000*s.se)*cval(di[s.fi]);
//		cerr<<v<<" "<<s.fi<<" "<<s.se<<" "<<nn<<"\n";
	}
//	if(pp&&!fl)cerr<<"?\n";
	return pp;
}
int sss;
inline int find(int ncol,int du,int las){
	++nowch;
	assert(td[du].size());
	int tot=0,ff=0;
	for(auto v:td[du]){
		if(col[v]^ncol)continue;
		if(v==las)continue;
//		cerr<<v<<" "<<"??????\n";
		if(ch(v)==has[v])ff=v,tot++;
		assert(has[v]);
	}
//	assert(tot<=1);
//	if(++sss<=20000)cerr<<tot<<"\n";
	if(tot==1)
	return ff;
//	cerr<<tot<<"\n"; 
	return -1;
}

int pre[S];
void dfs(){
	int d=NOR();
	di[curcnt]=NOR();
//	if((++sss)<=200)cerr<<curcnt<<"\n";
//	if((++sss)<=100)cerr<<curcnt<<" "<<d<<" "<<col[curcnt]<<"??\n";
	int *id=new int[S];
	for(int i=1;i<=d;i++)id[i]=i;
	random_shuffle(id+1,id+1+d);
	td[d].push_back(curcnt);
	int las=curcnt;
//	for(int i=1;i<=d;i++){
//		change(las,1,1
//	}
	for(int i=1;i<=d;i++){
		int p=id[i];
//		int p=i;
		if(p==pre[las]){
//			if(sss<=200)cerr<<p<<"\n";
			continue;
		}
		Move(p,col[las]);
		int val=Color();
		int k=LR();
		if(val==1){
			di[curcnt+1]=NOR();
			pre[curcnt+1]=LR();
			Add(las,curcnt+1);
			col[curcnt+1]=mr(2,wX);
			Move(1,col[curcnt+1]);
			Move(LR(),Color());
			assert(col[curcnt+1]==Color());
			change(las,curcnt+1,p);
//			assert(LR()==k);
			change(curcnt+1,las,k);
			curcnt++;
//			if(curcnt==n)return ;
			dfs();
		}
		else{
//			cerr<<las<<" "<<k<<" "<<p<<" "<<NOR()<<"?!\n";
			int now=find(val,NOR(),las);
			if(now==-1)fl=0;//,cerr<<las<<" "<<k<<" "<<p<<" "<<val<<"!!\n";
			else Add(now,las),
			change(now,las,k),change(las,now,p);
		}
		
//		cerr<<"assertin\n";
		Move(k,Color());
//		cerr<<"assertout\n";
		if(!fl)return ;
	}
}
void cle(){
	int d=NOR();
	for(int i=1;i<=d;i++){
		Move(i,1);
		int k=LR();
		if(Color()!=1){
			cle();
		}
		Move(k,1);
	}
}
int dis[S][S],ton[S];
void Inspect(int R){
	srand(time(0));
	// Write your code here.
//	n=N;
//	n=N;
//	cerr<<n<<"\n";
	while(!fl){
		for(int i=1;i<=1000;i++){
			Move(mr(1,NOR()),1);
		}
		fl=1;
		for(int i=0;i<S;i++)td[i].clear(),nedge[i].clear();
		for(int i=0;i<S;i++)has[i]=0,spec[i].clear(),pre[i]=0,col[i]=1;
		curcnt=1;
		col[1]=mr(2,wX);
		Move(1,col[1]);
		Move(LR(),Color());
		dfs();
//		if(++sss<=200){
//			for(int i=1;i<=curcnt;i++)cout<<col[i]<<" ";
//			cout<<"\n";
//		}
		for(int i=1;i<=10;i++){
			Move(mr(1,NOR()),1);
		}
		if(fl)break;
		cle();
	}
	cerr<<fl<<" "<<curcnt<<"\n";
	const int INF=1e9;
	n=curcnt;
//	for(int i=1;i<=n;i++){
//		cerr<<i<<" "<<di[i]<<"\n";
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)if(i^j)dis[i][j]=INF;
		for(auto v:nedge[i])dis[i][v]=1;
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
//			cerr<<i<<" "<<j<<" "<<dis[i][j]<<"\n";
			ton[dis[i][j]]++;
		}
	}
	for(int i=1;i<=R;i++)Answer(i,ton[i]);
}
